package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import com.spire.presentation.FileFormat;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.UUID;

/**
 * @author ChenYongHao
 * @date 2023/3/22 11:03
 * @desc文件上传和下载
 */
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
    @Value("${reggie.path}")
    private String basePath;

    /**
     * 文件上传
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
        //file是一个临时文件，需要转存到指定位置，否则本次请求完成后临时文件会删除
        log.info(file.toString());

        //原始文件名
        String originalFilename = file.getOriginalFilename();//abc.jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名，防止文件名称重复造成文件覆盖
        String fileName = UUID.randomUUID().toString() + suffix;//dfsdfdfd.jpg

        //创建一个目录对象
        File dir = new File(basePath);
        //判断当前目录是否存在
        if (!dir.exists()) {
            //目录不存在，需要创建
            dir.mkdirs();
        }

        try {
            //将临时文件转存到指定位置
            file.transferTo(new File(basePath + fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.success(fileName);
    }


    /**
     * 文件下载
     *
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {

        try {
            //输入流，通过输入流读取文件内容
            FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));

            //输出流，通过输出流将文件写回浏览器
            ServletOutputStream outputStream = response.getOutputStream();

            response.setContentType("image/jpeg");

            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, len);
                outputStream.flush();
            }

            //关闭资源
            outputStream.close();
            fileInputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //    @GetMapping("/downloadCopy")
    @RequestMapping(value = "/downloadFile")
    @ResponseBody
    public String downloadCopy(String name, HttpServletResponse response) {
        String suffix = "";
        if (name.endsWith(".xlsx") || name.endsWith(".xls")) {
            String pdfFileName = name.substring(0, name.lastIndexOf(".")) + ".pdf";
            partExcelToPDF(basePath + name,
                    basePath + pdfFileName, 1);
            name = pdfFileName;
        }
        // 配置文件下载
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        // 下载文件能正常显示中文
        try {
//            response.setHeader("Content-Disposition", "attachment;filename=" +
//                    URLEncoder.encode(System.currentTimeMillis() + name, "UTF-8"));

            response.setHeader("Content-Disposition", "attachment;filename=" +
                    URLEncoder.encode(name, "UTF-8"));
            String str = name.split("\\.")[1];

//            String file_name = new String(name.getBytes(), "ISO-8859-1");
//            response.setHeader("Content-Disposition", "attachment;filename=" +
//                    URLEncoder.encode(System.currentTimeMillis() + name, "UTF-8"));
//            response.setHeader("Content-Disposition", "attachment;filename=" + file_name);
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }


        // 实现文件下载
        byte[] buffer = new byte[1024];
        FileInputStream fis = null;
        BufferedInputStream bis = null;
        try {
            fis = new FileInputStream(basePath + name);
            bis = new BufferedInputStream(fis);
            OutputStream os = response.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
        } catch (Exception e) {

        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
//        if(name.endsWith(".pdf")){
//            File file = new File(basePath+name);
//            if (file.exists()) {
//                file.delete();
//            }
//        }
        return null;
    }

    /**
     * 使用spire简单整个Excel转换为pdf
     *
     * @param inputFilePath  Excel文件路径
     * @param outputFilePath 导出的PDF文件路径
     */
    public static void totalExcelToPDF(String inputFilePath, String outputFilePath) {
        Workbook wb = new Workbook();
        //        引入Excel文件
        wb.loadFromFile(inputFilePath);
        //        导出PDF文件
        wb.saveToFile(outputFilePath, String.valueOf(FileFormat.PDF));
    }

    /**
     * 使用spire将单个sheet转成pdf
     *
     * @param inputFilePath  Excel文件路径
     * @param outputFilePath 导出的PDF文件路径
     * @param sheetNum       导出的sheet页下标
     */
    public static void partExcelToPDF(String inputFilePath, String outputFilePath, int sheetNum) {
        //加载Excel文档
        Workbook wb = new Workbook();
        wb.loadFromFile(inputFilePath);
        //获取到哪一个sheet页
        Worksheet sheet = wb.getWorksheets().get(sheetNum);
        //调用方法保存为PDF格式
        sheet.saveToPdf(outputFilePath);
    }

    @DeleteMapping("/deleteFile")
    public R<String> deleteFile(@RequestParam("name")String fileName) {
        try {
            File file = new File(basePath + fileName);
            if (file.exists()) {
                file.delete();
            }else{
               throw new RuntimeException("文件名不存在"+fileName);
            }

            //将临时文件转存到指定位置
        } catch (Throwable e) {
            e.printStackTrace();
            return R.error(e.getMessage());
        }
        return R.success(fileName);
    }

    @PostMapping("/saveUpload")
    public R<String> saveUpload(@RequestParam("file")MultipartFile file) {
        //file是一个临时文件，需要转存到指定位置，否则本次请求完成后临时文件会删除
        log.info(file.toString());

        //原始文件名
        String originalFilename = file.getOriginalFilename();//abc.jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名，防止文件名称重复造成文件覆盖
        String fileName = UUID.randomUUID().toString() + suffix;//dfsdfdfd.jpg

        //创建一个目录对象
        File dir = new File(basePath);
        //判断当前目录是否存在
        if (!dir.exists()) {
            //目录不存在，需要创建
            dir.mkdirs();
        }

        try {
            //将临时文件转存到指定位置
            file.transferTo(new File(basePath + fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.success(fileName);
    }
}
